/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;

/**
 *
 * @author aluno
 */
public class Dao<T> {
    private EntityManager em =
            Persistence.createEntityManagerFactory("UP").createEntityManager();
    private Class classe;

    public Dao(Class classe) {
        this.classe = classe;
    }
    public void insert(T entidade) {
        em.getTransaction().begin();
        em.persist(entidade);
        em.getTransaction().commit();
    }
    public void update(T entidade) {
        em.getTransaction().begin();
        em.merge(entidade);
        em.getTransaction().commit();
    }
    public void remove(int id) {
        T entidade = get(id);
        if (entidade == null) {
            return;
        }
        em.getTransaction().begin();
        em.remove(entidade);
        em.getTransaction().commit();
    }
    public T get(int id) {
        return (T)em.find(classe, id);
    }
    public List<T> list() {
        return em.createQuery("SELECT e FROM "+classe.getSimpleName()+" e").getResultList();
    }
    public List<T> listByNome(String nome) {
        return em.createQuery("SELECT e FROM "+classe.getSimpleName()+" e WHERE e.nome LIKE '%"+nome+"%'").getResultList();
    }
    
    public List<T> listByNomeSemMim(String nome, int id) {
        return em.createQuery("SELECT e FROM "+classe.getSimpleName()+" e WHERE e.nome LIKE '%"+nome+"%' AND e.id <> "+id).getResultList();
    }
     public List<T> listByTipo(String tipo) {
        return em.createQuery("SELECT e FROM "+classe.getSimpleName()+" e WHERE e.tipo LIKE '"+tipo+"'").getResultList();
    }
      public List<T> listByTitulo(String titulo) {
        return em.createQuery("SELECT e FROM "+classe.getSimpleName()+" e WHERE e.titulo LIKE '%"+titulo+"%'").getResultList();
    }
    public void close() {
        em.close();
    }
    public List<T> listByNomeAndAutor(String nome, String autor) {
        return em.createQuery("SELECT e FROM "+classe.getSimpleName()+" e WHERE e.nome LIKE '%"+nome+"%' AND "+
                "e.autor LIKE '%"+autor+"%'").getResultList();
    }

    public List<T> listByNomeAndTipo(String nome, String tipo) {
        System.out.println("SELECT e FROM "+classe.getSimpleName()+" e WHERE e.nome LIKE '%"+nome+"%' AND "+
                "e.tipo LIKE " +tipo);
        return em.createQuery("SELECT e FROM "+classe.getSimpleName()+" e WHERE e.nome LIKE '%"+nome+"%' AND "+
                "e.tipo LIKE '" + tipo+ "'").getResultList();
    }
    
    public List<T> listByTipoCategoria(String tipo) {
        return em.createQuery("SELECT e FROM " + classe.getSimpleName() + " e WHERE e.tipo LIKE '" + tipo + "'").getResultList();
    }

    public List<T> listByTituloAndCategoria(String titulo, int categoria) {
         return em.createQuery("SELECT e FROM " + classe.getSimpleName() + " e WHERE e.titulo LIKE '%" + titulo + "%' AND "
                + "e.categoria.id = " + categoria).getResultList();
    

    }
     
           
       public List<T> listByLoginandSenha(String login, String senha){
        return em.createQuery("SELECT e FROM " +classe.getSimpleName() + " e WHERE e.login LIKE '" +login+   "'  AND" 
              + " e.senha LIKE '" +senha+ "'").getResultList();
    }
       
    
}
